package language.advanced.functional;

import lombok.Data;

import java.util.function.Function;

/**
 * Desc: TODO ADD DESC
 * <p>
 * Function:函数式接口是只包含一个抽象方法的接口，该抽象方法的签名称作函数式接口的函数描述符。
 * 假如函数式接口的函数描述符为 ()->void，则该接口包含的抽象方法的入参、出参皆为空。
 * Java 中许多常见的接口都属于函数式接口，如 Runnable、Callable、Comparator等。
 * 下面是Runnable接口的定义。由于它只有一个名为 run 的抽象方法，所以属于函数式接口。
 */
public class TestInterfaceFunction {

    @FunctionalInterface //也可以不加
    interface HandleProcessBiz {
        void handleBiz();
    }

    public static void main(String[] args) {
        HandleProcessBiz handle = () -> System.out.println("这里使用A的函数式接口来赋值给类型是A的变量a");

        //自定义的函数式接口
        handle(() -> {
            System.out.println("Enum");
        });

        //内置的函数式接口
        method(s -> Integer.parseInt(s));
        //在哪里用到  s -> Integer.parseInt(s) 这样的表达式？
        //答：作为函数的参数
        //所以该函数的形参为Function<String, Integer> function   或  HandleProcessBiz biz 这样的函数式接口

        //使用方法引用
        method(User::fun1);
    }

    static void method(Function<String, Integer> function) {
        int num = function.apply("10");
        System.out.println(num + 20);
    }


    static void handle(HandleProcessBiz biz){
        biz.handleBiz();
    }

    @Data
    static class User {
        private Long id;
        public static int fun1(String a){
            return 1;
        }
    }
}

